//
//  ZRUserAccountViewModel.swift
//  XJ8XWB
//
//  Created by 中二 on 2016/10/27.
//  Copyright © 2016年 中二. All rights reserved.
//

import UIKit

class ZRUserAccountViewModel {

    static let sharedTools: ZRUserAccountViewModel = ZRUserAccountViewModel()
    
    var userAccountModel: ZRUserAccountModel?
    
    
    let file = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! as NSString).appendingPathComponent("userAccount.archiver")
    
    var isLogin:Bool{
        
        
        return accessToken != nil
    }
    
    var accessToken:String?{
        if userAccountModel?.expires_Date?.compare(Date()) == ComparisonResult.orderedDescending {
            return userAccountModel?.access_token
        }else {
            return nil
        }

        
    }
    
    init() {
        // 用户模型赋值
        userAccountModel = getUserAccountModel()
        
    }
    
    
}

// MARK: - ViewModel帮助控制器请求数据
extension ZRUserAccountViewModel {
    // 获取 token
    func getUserAccount(code: String, finish:@escaping (Bool)->()){
        // 发送请求
        ZRNetworkTools.sharedTools.oauthLoadUserAccount(code: code, success: { (response) in
            // 判断response 是否为 nil 而且是否可以转成字典
            // guard 或者 if-let 判断就是可选值 所以如果转成你想要的类型 需要使用 as? 即可
            guard let res = response as?[String: Any] else{
                finish(false)
                return
            }
            // 字典转模型
            let userAccountModel = ZRUserAccountModel.yy_model(withJSON: res)
            
            // 判断userAccountModel 不为 nil
            guard let model = userAccountModel else {
                finish(false)
                return
            }
            // 请求用户信息
            self.getUserInfo(model: model, finish: finish)
        }) { (error) in
            finish(false)
            print("请求失败",error)
        }
    }
    
    // 请求用户信息
    func getUserInfo(model: ZRUserAccountModel, finish:@escaping (Bool)->()){
        // 发送请求
        ZRNetworkTools.sharedTools.oauthLoadUserInfo(model: model, success: { (response) in
            // 判断response 是否为 nil 而且是否可以转成一个字典
            guard let res = response as?[String: Any] else{
                finish(false)
                return
            }
            // 因为后期需要保存该模型 直接使用 一个 model 即可 需要直接手动赋值]
            model.screen_name = res["screen_name"] as? String
            model.avatar_large = res["avatar_large"] as? String
            // 保存模型
            self.saveUserAccountModel(model: model)
            // 最终的成功的执行闭包
            finish(true)
        }) { (error) in
            finish(false)
            print("请求失败",error)
        }
    }
}



extension ZRUserAccountViewModel {
    
    // 保存用户信息对象
    func saveUserAccountModel(model: ZRUserAccountModel){
        // 因为首次使用该类的时候 会走 init 方法 但是我们第一次登陆 app 根本没有保存过个人信息数据 导致userAccountModel 为 nil
        // 解决方法 需要外界调用该方法保存用户对象的时候 程序员手动给单例对象的userAccountModel 赋值
        userAccountModel = model
        NSKeyedArchiver.archiveRootObject(model, toFile: file)
    }
    // 获取用户信息对象
    fileprivate func getUserAccountModel() ->ZRUserAccountModel?{
        let result = NSKeyedUnarchiver.unarchiveObject(withFile: file) as? ZRUserAccountModel
        return result
    }
    
    
}















